﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.IO;

namespace Acounting
{
    public partial class BillPrint : Form
    {
        public BillPrint(string CName, string CMobile1, string CMobile2, string CAddress,
            string CTelephone, string ReportType, string ReportDate, string ReportName,string ReportRemaining,string ReportPaid,
            bool Table1,bool Table2,DataTable table)
        {
            InitializeComponent();

            ReportParameter p1 = new ReportParameter("CName", CName);
            ReportParameter p2 = new ReportParameter("CMobile1", CMobile1);
            ReportParameter p3 = new ReportParameter("CMobile2", CMobile2);
            ReportParameter p4 = new ReportParameter("CAddress", CAddress);
            ReportParameter p5 = new ReportParameter("CTelephone", CTelephone);
            ReportParameter p6 = new ReportParameter("ReportType", ReportType);
            ReportParameter p7 = new ReportParameter("ReportDate", ReportDate);
            ReportParameter p8 = new ReportParameter("ReportName", ReportName);
            ReportParameter p9 = new ReportParameter("Table1", Table1.ToString());
            ReportParameter p10 = new ReportParameter("Table2", Table2.ToString());
            ReportParameter p11 = new ReportParameter("ReportPaid", ReportRemaining);
            ReportParameter p12 = new ReportParameter("ReportRemaining", ReportPaid);

            reportViewer1.LocalReport.SetParameters(new ReportParameter[] { p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 });
            
            reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ItemsDetails", table));
            reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("ItemsDetails2", table));
           
            
        }
        public void PrintDirectly()
        {
            Export(reportViewer1.LocalReport);
            Print();

        }

        private int m_currentPageIndex;
        private IList<Stream> m_streams;

        // Routine to provide to the report renderer, in order to
        //    save an image for each page of the report.
        private Stream CreateStream(string name,
          string fileNameExtension, Encoding encoding,
          string mimeType, bool willSeek)
        {
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }
        // Export the given report as an EMF (Enhanced Metafile) file.
        private void Export(LocalReport report)
        {
            //a4 calibration
            string deviceInfo =
              @"<DeviceInfo>
                <OutputFormat>EMF</OutputFormat>
                <PageWidth>8.5in</PageWidth>
                <PageHeight>11in</PageHeight>
                <MarginTop>0.25in</MarginTop>
                <MarginLeft>1.25in</MarginLeft>
                <MarginRight>0.25in</MarginRight>
                <MarginBottom>0.25in</MarginBottom>
            </DeviceInfo>";
            Warning[] warnings;
            m_streams = new List<Stream>();
            report.Render("Image", deviceInfo, CreateStream,
               out warnings);
            foreach (Stream stream in m_streams)
                stream.Position = 0;
        }
        // Handler for PrintPageEvents
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            Metafile pageImage = new
               Metafile(m_streams[m_currentPageIndex]);

            // Adjust rectangular area with printer margins.
            Rectangle adjustedRect = new Rectangle(
                ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
                ev.PageBounds.Width,
                ev.PageBounds.Height);

            // Draw a white background for the report
            ev.Graphics.FillRectangle(Brushes.White, adjustedRect);

            // Draw the report content
            ev.Graphics.DrawImage(pageImage, adjustedRect);

            // Prepare for the next page. Make sure we haven't hit the end.
            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }

        private void Print()
        {
            if (m_streams == null || m_streams.Count == 0)
                throw new Exception("Error: no stream to print.");
            PrintDocument printDoc = new PrintDocument();
            if (!printDoc.PrinterSettings.IsValid)
            {
                throw new Exception("Error: cannot find the default printer.");
            }
            else
            {
                printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
                m_currentPageIndex = 0;
                printDoc.Print();
            }
        }

        private void BillPrint_Load(object sender, EventArgs e)
        {
            reportViewer1.RefreshReport(); 
        }

    }
}
